Spring Security 实战干货:OAuth2授权回调的核心认证流程
1. 前言
我们在上一篇Spring Security 实战干货:OAuth2 授权回调的处理机制对 OAuth2 服务端调用客户端回调的流程进行了图解, 今天我们来深入了解 OAuth2 在回调中进行认证细节。
2. AuthenticationManager
当 Spring Security 拦截到回调接口后会封装一个OAuth2LoginAuthenticationToken
交给AuthenticationManager
进行认证。在之前Spring Security 实战干货:理解 AuthenticationManager一文中我们正好对AuthenticationManager
的机制有详细的讲解,所以要快速理解本文应该去看看这一篇。
其中登录认证凭据封装为UsernamePasswordAuthenticationToken
然后根据 Token 的类型找到对应的AuthenticationProvider
进行认证。
3. OAuth2 对应的 AuthenticationProvider
那么 OAuth2 登录有异曲同工之妙,我们需要找到OAuth2LoginAuthenticationToken
对应的AuthenticationProvider
。这里找到了两个:
OAuth2LoginAuthenticationProvider
OidcAuthorizationCodeAuthenticationProvider
这两个各自对应的场景是什么呢,OAuth2LoginAuthenticationToken
中有以下片段:
if (loginAuthenticationToken.getAuthorizationExchange()
.getAuthorizationRequest().getScopes().contains("openid")) {
// This is an OpenID Connect Authentication Request so return null
// and let OidcAuthorizationCodeAuthenticationProvider handle it instead
return null;
}
意思是说scopes
中如果包含了openid
就直接返回null
,不会被OAuth2LoginAuthenticationToken
处理,而OidcAuthorizationCodeAuthenticationProvider
中正好相反。根据以往文章的脉络OAuth2LoginAuthenticationProvider
就是我们需要的。
有兴趣可了解基于OIDC的 OAuth2 认证。
4. OAuth2LoginAuthenticationProvider
OAuth2LoginAuthenticationProvider
实现了授权回调的认证过程:
从上图中我们可以看出具体认证由OAuth2AuthorizationCodeAuthenticationProvider
来负责,认证通过后会去获取用户的信息并封装为OAuth2User
,最终生成授权成功的OAuth2LoginAuthenticationToken
。
基于篇幅的原因,下一篇我们会分析OAuth2AuthorizationCodeAuthenticationProvider
的处理机制。系列博文请访问felord.cn
2020-12-02
2020-11-13